package com.wxzz.elearing.pay.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wxzz.elearing.pay.dto.UserIdGetUserWalletDto;
import com.wxzz.elearing.pay.entity.UserWallet;
import com.wxzz.elearing.pay.mapper.UserWalletMapper;
import com.wxzz.elearing.pay.service.IUserWalletService;
import com.wxzz.elearing.pay.service.openfeign.IWxUserApiFeign;
import com.wxzz.elearning.common.aop.Idempotent;
import com.wxzz.elearning.common.dto.FeignUserWalletDto;
import com.wxzz.elearning.common.vo.ReturnVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * <p>
 * 用户钱包 服务实现类
 * </p>
 *
 * @author
 * @since 2021-04-23
 */
@Service
public class UserWalletServiceImpl extends ServiceImpl<UserWalletMapper, UserWallet> implements IUserWalletService {

    @Autowired
    private UserWalletMapper userWalletMapper;

    @Idempotent
    @Override
    public FeignUserWalletDto selectUserWalletByUserIdAndType(Long userId, Integer userType) {
        //平台端id为0
        UserWallet userWallet = userWalletMapper.selectOne(new LambdaQueryWrapper<UserWallet>()
                .eq(UserWallet::getUserId, userId)
                .eq(UserWallet::getUserType, userType));
        FeignUserWalletDto feignUserWalletDto = new FeignUserWalletDto();
        if (userWallet == null) {
            //如果不存在 创建一条默认数据
            userWallet = new UserWallet();
            //平台端id为0
            userWallet.setUserId(userId);
            userWallet.setUserType(userType);
            userWalletMapper.insert(userWallet);
        }
        BeanUtils.copyProperties(userWallet, feignUserWalletDto);
        return feignUserWalletDto;
    }

    @Override
    public ReturnVO tokenGetUserWallet(JSONObject jsonObject, Integer userType) {
        QueryWrapper<UserWallet> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_type", userType);
        Long userId = null;
        //平台
        if (userType != null && userType == 0) {
            userId = 0L;
        }
        //企业
        if (userType != null && userType == 1) {
            userId = jsonObject.getLong("enterpriseId");
        }
        //用户
        if (userType != null && userType == 2) {
            userId = jsonObject.getLong("id");
        }
        //讲师
        if (userType != null && userType == 3) {
            userId = jsonObject.getLong("docentId");
        }
        queryWrapper.eq("user_id", userId);
        UserWallet userWallet = userWalletMapper.selectOne(queryWrapper);
        if (userWallet == null) {
            //如果不存在 创建一条默认数据
            userWallet = new UserWallet();
            //平台端id为0
            userWallet.setUserId(userId);
            userWallet.setUserType(userType);
            userWalletMapper.insert(userWallet);
        }
        //设置提现规则
        userWallet.setParamDetail(wxUserApiFeign.selectOne("withdrawalRules"));
        return new ReturnVO("钱包查询成功", userWallet);
    }

    @Autowired
    private IWxUserApiFeign wxUserApiFeign;

    @Override
    public ReturnVO<UserWallet> userIdGetUserWallet(UserIdGetUserWalletDto userIdGetUserWalletDto) {
        UserWallet userWallet = userWalletMapper.selectOne(new LambdaQueryWrapper<UserWallet>()
                .eq(UserWallet::getUserId, userIdGetUserWalletDto.getUserId())
                .eq(UserWallet::getUserType, userIdGetUserWalletDto.getUserType()));
        if (userWallet == null) {
            //如果不存在 创建一条默认数据
            userWallet = new UserWallet();
            //平台端id为0
            userWallet.setUserId(userIdGetUserWalletDto.getUserId());
            userWallet.setUserType(userIdGetUserWalletDto.getUserType());
            userWalletMapper.insert(userWallet);
        }
        return new ReturnVO("钱包查询成功", userWallet);
    }

    @Idempotent
    @Override
    public UserWallet updateUserWallet(Long userId, Integer userType, BigDecimal decimal) {
        //平台端id为0
        UserWallet userWallet = userWalletMapper.selectOne(new LambdaQueryWrapper<UserWallet>()
                .eq(UserWallet::getUserId, userId)
                .eq(UserWallet::getUserType, userType));
        if (userWallet == null) {
            //如果不存在 创建一条默认数据
            userWallet = new UserWallet();
            //平台端id为0
            userWallet.setUserId(userId);
            userWallet.setUserType(userType);
            userWalletMapper.insert(userWallet);
        }
        //用户余额
        userWallet.setUserBalance(userWallet.getUserBalance().add(decimal));
        if (new BigDecimal("0.00").compareTo(decimal) < 1) {
            //只有收益才计入累计资产
            userWallet.setAccumulate(userWallet.getUserBalance().add(decimal));
        }
        userWalletMapper.updateById(userWallet);
        return userWallet;
    }
}
